# -*- coding: utf-8 -*-

from memoriaFisica.MemoriaFisica import MemoriaFisica
from memoriaFisica.paginacion.Paginacion import Paginacion

class MMUpaginacion:
###############################################################################################################
    #INICIALIZACION
    def __init__ (self, tamanioMemoria, listaDirecciones):
        self.io = None
        self.memoriaFisica = MemoriaFisica (tamanioMemoria)
        self.paginacion = Paginacion(5, (tamanioMemoria//5))
        self.paginacion.setMMU(self)
        self.listaDireccionesVaciasEnMemoria=listaDirecciones #[0,5,10]#[0,5,10,15,20,25,30,35,40,45]
        self.tablaDePaginas= {}#(pag-dirBaseMemoria)

###############################################################################################################
    #METODOS
    
    def loadProgram (self, pcb):
        self.paginacion.realizarAsignacion(pcb.getProgram())
    
    def get (self, pcb):
        return self.paginacion.get(pcb)
    
    def unload (self, pcb):
        program = pcb.getProgram()
        pag= self.paginacion.dicProgramPagActual[program]
        del self.paginacion.dicProgramPagActual[program]
        lista = self.paginacion.tablaProgramListPaginas[program]
        del self.paginacion.tablaProgramListPaginas[program]
        self.paginacion.programasCargados.remove(program)
        lista.append(pag)
        print(len(lista))
        self.limpiarMemoriayTAblaDePaginas(lista)
        
    def ponerListo(self,temporal):#Esta para que sea transparente para el so, si cambia la clase de mmu
        if len (self.paginacion.programasCargados)==0:
            self.paginacion.realizarAsignacion(temporal.getProgram())
        
    def cargarPaginaEnMemoria (self, pag):
        print (self.listaDireccionesVaciasEnMemoria)
        baseEnMemoria = self.listaDireccionesVaciasEnMemoria.pop(0)
        self.tablaDePaginas[pag]= baseEnMemoria
        for ins in pag.miPagina:
            self.memoriaFisica.put (ins, baseEnMemoria)
            baseEnMemoria+=1
            
    def limpiarMemoriayTAblaDePaginas(self, pagina):
        dir = self.tablaDePaginas[pagina]
        self.listaDireccionesVaciasEnMemoria.append(dir)
        while dir < (self.tablaDePaginas[pagina] + self.paginacion.tamanioPaginacion):
            self.memoriaFisica.put (None, dir)
            dir =dir + 1
        del self.tablaDePaginas[pagina]


###############################################################################################################
    #SE&GET
    def setIO(self,io):
        self.io = io
        self.paginacion.setIO(self.io)
